/*
 * Eduardo Wass Rosado
 * eduwass@gmail.com
 */

package edu.ub.prog2.WassRosadoEduardo.vista;

// UI
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

// Control
import edu.ub.prog2.WassRosadoEduardo.controlador.CtrlReproductor;
import edu.ub.prog2.WassRosadoEduardo.model.FitxerAudio;
import edu.ub.prog2.WassRosadoEduardo.model.LlistaFitxers;
import edu.ub.prog2.WassRosadoEduardo.model.LlistaReproduccio;
import edu.ub.prog2.utils.FitxerAudioErrorException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JOptionPane;

/**
 * Nova classe vista feta amb SWING
 * @author ewass
 */
public class ReproductorUB4 extends javax.swing.JFrame {
    
    // Enlace a Controlador
    private CtrlReproductor Controlador;
    
    
    /**
     * Funcion constructora
     */
    public ReproductorUB4() {
        initComponents();
        
        // Establecer el look and feel de Windows
        try {
            //Set the required look and feel
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            //Update the component tree - associate the look and feel with the given frame.
            SwingUtilities.updateComponentTreeUI(this);
        }//end try
        catch (Exception ex) {
            ex.printStackTrace();
        }//end catch

        // Centrar ventana
        this.setLocationRelativeTo(null);
        
        // Inicializar control
        this.Controlador = new CtrlReproductor();
        
        // Cargar info:
        this.reload();
    }

    /**
     * Retorna el controlador
     * @return 
     */
    public CtrlReproductor DonaControlador(){
        return this.Controlador;
    }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        tabs = new javax.swing.JTabbedPane();
        tabBiblioteca = new javax.swing.JPanel();
        toolbarBiblioteca = new javax.swing.JToolBar();
        btnAddBiblioteca = new javax.swing.JButton();
        btnDelBiblioteca = new javax.swing.JButton();
        btnPLayBiblioteca = new javax.swing.JButton();
        panelBiblioteca = new javax.swing.JPanel();
        bibliotecaScrollPane = new javax.swing.JScrollPane();
        bibliotecaLista = new javax.swing.JList();
        tabListas = new javax.swing.JPanel();
        toolbarListas = new javax.swing.JToolBar();
        btnAddLista = new javax.swing.JButton();
        btnDelLista = new javax.swing.JButton();
        btnPlayLista = new javax.swing.JButton();
        panelListas = new javax.swing.JPanel();
        listasScrollPane = new javax.swing.JScrollPane();
        listasLista = new javax.swing.JList();
        listasCombo = new javax.swing.JComboBox();
        toolbarListas2 = new javax.swing.JToolBar();
        btnAddCancion = new javax.swing.JButton();
        btnDelCancion = new javax.swing.JButton();
        btnPlayCancion = new javax.swing.JButton();
        menuPrincipal = new javax.swing.JMenuBar();
        btnPlay = new javax.swing.JMenu();
        btnPause = new javax.swing.JMenu();
        btnStop = new javax.swing.JMenu();
        btnNext = new javax.swing.JMenu();
        btnRepetir = new javax.swing.JMenu();
        btnAleatori = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("UB MP3 Player");
        setForeground(java.awt.Color.white);
        setResizable(false);

        tabs.setToolTipText("");

        toolbarBiblioteca.setFloatable(false);
        toolbarBiblioteca.setRollover(true);
        toolbarBiblioteca.setBorderPainted(false);
        toolbarBiblioteca.setFocusable(false);

        btnAddBiblioteca.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/add.png"))); // NOI18N
        btnAddBiblioteca.setText("Añadir canción");
        btnAddBiblioteca.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAddBibliotecaActionPerformed(evt);
            }
        });
        toolbarBiblioteca.add(btnAddBiblioteca);

        btnDelBiblioteca.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/delete.png"))); // NOI18N
        btnDelBiblioteca.setText("Eliminar canción");
        btnDelBiblioteca.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDelBibliotecaActionPerformed(evt);
            }
        });
        toolbarBiblioteca.add(btnDelBiblioteca);

        btnPLayBiblioteca.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/control_play_blue.png"))); // NOI18N
        btnPLayBiblioteca.setText("Reproducir Biblioteca");
        btnPLayBiblioteca.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPLayBibliotecaActionPerformed(evt);
            }
        });
        toolbarBiblioteca.add(btnPLayBiblioteca);

        bibliotecaLista.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        bibliotecaScrollPane.setViewportView(bibliotecaLista);

        javax.swing.GroupLayout panelBibliotecaLayout = new javax.swing.GroupLayout(panelBiblioteca);
        panelBiblioteca.setLayout(panelBibliotecaLayout);
        panelBibliotecaLayout.setHorizontalGroup(
            panelBibliotecaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBibliotecaLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(bibliotecaScrollPane)
                .addContainerGap())
        );
        panelBibliotecaLayout.setVerticalGroup(
            panelBibliotecaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelBibliotecaLayout.createSequentialGroup()
                .addComponent(bibliotecaScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 227, Short.MAX_VALUE)
                .addContainerGap())
        );

        javax.swing.GroupLayout tabBibliotecaLayout = new javax.swing.GroupLayout(tabBiblioteca);
        tabBiblioteca.setLayout(tabBibliotecaLayout);
        tabBibliotecaLayout.setHorizontalGroup(
            tabBibliotecaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(toolbarBiblioteca, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)
            .addComponent(panelBiblioteca, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        tabBibliotecaLayout.setVerticalGroup(
            tabBibliotecaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(tabBibliotecaLayout.createSequentialGroup()
                .addComponent(toolbarBiblioteca, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelBiblioteca, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        tabs.addTab("Mi Biblioteca", tabBiblioteca);

        toolbarListas.setFloatable(false);
        toolbarListas.setRollover(true);
        toolbarListas.setBorderPainted(false);
        toolbarListas.setFocusable(false);

        btnAddLista.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/page_blank_add.png"))); // NOI18N
        btnAddLista.setText("Nueva Lista");
        btnAddLista.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAddListaActionPerformed(evt);
            }
        });
        toolbarListas.add(btnAddLista);

        btnDelLista.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/page_blank_close.png"))); // NOI18N
        btnDelLista.setText("Eliminar Lista");
        btnDelLista.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDelListaActionPerformed(evt);
            }
        });
        toolbarListas.add(btnDelLista);

        btnPlayLista.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/control_play_blue.png"))); // NOI18N
        btnPlayLista.setText("Reproducir Lista");
        btnPlayLista.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPlayListaActionPerformed(evt);
            }
        });
        toolbarListas.add(btnPlayLista);

        listasLista.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        listasScrollPane.setViewportView(listasLista);

        listasCombo.setToolTipText("");
        listasCombo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                listasComboActionPerformed(evt);
            }
        });

        toolbarListas2.setFloatable(false);
        toolbarListas2.setBorderPainted(false);
        toolbarListas2.setFocusable(false);

        btnAddCancion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/cd_add.png"))); // NOI18N
        btnAddCancion.setText("Añadir canción");
        btnAddCancion.setFocusable(false);
        btnAddCancion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnAddCancion.setInheritsPopupMenu(true);
        btnAddCancion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnAddCancion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAddCancionActionPerformed(evt);
            }
        });
        toolbarListas2.add(btnAddCancion);

        btnDelCancion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/cd_delete.png"))); // NOI18N
        btnDelCancion.setText("Quitar canción");
        btnDelCancion.setFocusable(false);
        btnDelCancion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnDelCancion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnDelCancion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDelCancionActionPerformed(evt);
            }
        });
        toolbarListas2.add(btnDelCancion);

        btnPlayCancion.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/control_play_blue.png"))); // NOI18N
        btnPlayCancion.setText("Reproducir canción");
        btnPlayCancion.setFocusable(false);
        btnPlayCancion.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btnPlayCancion.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btnPlayCancion.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnPlayCancionActionPerformed(evt);
            }
        });
        toolbarListas2.add(btnPlayCancion);

        javax.swing.GroupLayout panelListasLayout = new javax.swing.GroupLayout(panelListas);
        panelListas.setLayout(panelListasLayout);
        panelListasLayout.setHorizontalGroup(
            panelListasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelListasLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelListasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(listasCombo, javax.swing.GroupLayout.Alignment.TRAILING, 0, 397, Short.MAX_VALUE)
                    .addComponent(listasScrollPane, javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelListasLayout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(toolbarListas2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(67, 67, 67)))
                .addContainerGap())
        );
        panelListasLayout.setVerticalGroup(
            panelListasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelListasLayout.createSequentialGroup()
                .addComponent(listasCombo, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(listasScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(toolbarListas2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(106, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout tabListasLayout = new javax.swing.GroupLayout(tabListas);
        tabListas.setLayout(tabListasLayout);
        tabListasLayout.setHorizontalGroup(
            tabListasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(toolbarListas, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)
            .addComponent(panelListas, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        tabListasLayout.setVerticalGroup(
            tabListasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(tabListasLayout.createSequentialGroup()
                .addComponent(toolbarListas, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelListas, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        tabs.addTab("Listas de Reproducción", tabListas);

        menuPrincipal.setFocusable(false);
        menuPrincipal.setPreferredSize(new java.awt.Dimension(246, 44));
        menuPrincipal.setRequestFocusEnabled(false);
        menuPrincipal.setVerifyInputWhenFocusTarget(false);

        btnPlay.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/control_play_blue.png"))); // NOI18N
        btnPlay.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnPlayMouseClicked(evt);
            }
        });
        menuPrincipal.add(btnPlay);

        btnPause.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/control_pause_blue.png"))); // NOI18N
        btnPause.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnPauseMouseClicked(evt);
            }
        });
        menuPrincipal.add(btnPause);

        btnStop.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/control_stop_blue.png"))); // NOI18N
        btnStop.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnStopMouseClicked(evt);
            }
        });
        menuPrincipal.add(btnStop);

        btnNext.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/control_fastforward_blue.png"))); // NOI18N
        btnNext.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnNextMouseClicked(evt);
            }
        });
        menuPrincipal.add(btnNext);

        btnRepetir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/control_repeat_blue.png"))); // NOI18N
        btnRepetir.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnRepetirMouseClicked(evt);
            }
        });
        menuPrincipal.add(btnRepetir);

        btnAleatori.setIcon(new javax.swing.ImageIcon(getClass().getResource("/img/arrow_switch.png"))); // NOI18N
        btnAleatori.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                btnAleatoriMouseClicked(evt);
            }
        });
        menuPrincipal.add(btnAleatori);

        setJMenuBar(menuPrincipal);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tabs, javax.swing.GroupLayout.Alignment.TRAILING)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(tabs, javax.swing.GroupLayout.PREFERRED_SIZE, 322, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Boto per reproduir biblioteca
     * @param evt 
     */
    private void btnPLayBibliotecaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPLayBibliotecaActionPerformed
        try {
            Controlador.playLlista(Controlador.getBiblioteca());
        } catch (FitxerAudioErrorException ex) {
            JOptionPane.showMessageDialog(null, "Error al reproducir archivo.");
        }
    }//GEN-LAST:event_btnPLayBibliotecaActionPerformed

    /**
     * Boto per eliminar un fitxer de la biblioteca
     * @param evt 
     */
    private void btnDelBibliotecaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDelBibliotecaActionPerformed
        // Obtener indice de fichero a eliminar
        int indiceFichero = bibliotecaLista.getSelectedIndex()+1;
        // Crear objeto
        FitxerAudio f = Controlador.donaFitxerAudio(indiceFichero);
        // Llamada a controlador
        Controlador.eliminarFitxer(f);
        // Recargar vista
        this.reload();
    }//GEN-LAST:event_btnDelBibliotecaActionPerformed

    /**
     * Boto per afegir un fitxer a la biblioteca
     * @param evt 
     */
    private void btnAddBibliotecaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddBibliotecaActionPerformed
        // Abrir FrmAfegirFitxer
        FrmAfegirFitxer Ventana = new FrmAfegirFitxer(this);
        Ventana.setVisible(true);
        this.setVisible(false);
    }//GEN-LAST:event_btnAddBibliotecaActionPerformed

    /**
     * Boto per afegir una nova llista de repr.
     * @param evt 
     */
    private void btnAddListaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddListaActionPerformed
        // Pedir por dialog el nombre de la bigList:
        String nombre = JOptionPane.showInputDialog(null, "Nombre de la nueva lista:", "Nueva Lista",
                JOptionPane.QUESTION_MESSAGE);
        // Comprovar que no estigui repetida
        if (Controlador.existeixLlista(nombre)) {
            JOptionPane.showMessageDialog(null, "Ya existe una lista con el mismo nombre!");
        } else {
            // Si no esta repetida, crear
            Controlador.crearLlistaReproduccio(nombre);
            // Recargar vista
            this.reloadListas();
        }
        
    }//GEN-LAST:event_btnAddListaActionPerformed

    /**
     * Boto per eliminar una llista
     * @param evt 
     */
    private void btnDelListaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDelListaActionPerformed
        // Obtener indice a eliminar
        int indice = listasCombo.getSelectedIndex() + 1;
        // Llamar a controlador para eliminar
        Controlador.eliminarLlistaReproduccio(indice);
        // Recargar vista
        this.reloadListas();
    }//GEN-LAST:event_btnDelListaActionPerformed

    /**
     * Boto per reproduir llista
     * @param evt 
     */
    private void btnPlayListaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPlayListaActionPerformed
        // Obtener indice lista
        int indice = listasCombo.getSelectedIndex() + 1;
        // Reproducir lista
        LlistaReproduccio l = Controlador.donaLlista(indice);
        try {
            Controlador.playLlista(l.donaLlistaFitxers());
        } catch (FitxerAudioErrorException ex) {
            JOptionPane.showMessageDialog(null, "Error al reproducir archivo.");
        }
    }//GEN-LAST:event_btnPlayListaActionPerformed

    /**
     * Boto per afegir canco a llista
     * @param evt 
     */
    private void btnAddCancionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddCancionActionPerformed
        // Obtener indice de lista seleccionada
        int indice = listasCombo.getSelectedIndex() + 1;
        if(indice<=0){
            // Si no hay bigList
            JOptionPane.showMessageDialog(null, "Primero debes crear una lista!");
        } else {
            // Cargar llista 
            LlistaReproduccio llista = Controlador.donaLlista(indice);
            if(llista.donaTamany()>=llista.donaLimit()){
                // Mostrar error
                JOptionPane.showMessageDialog(null, "Lista llena, no se pueden añadir más canciones!");
            } else {
                // Mostrar panel para seleccionar cancion a añadir:
                String[] bigList = new String[30];
                // Obtener biblioteca del controlador:
                LlistaFitxers biblioteca = Controlador.getBiblioteca();
                // Recorrer y añadir a modelo
                for (int i = 0; i < Controlador.donaTamanyBiblioteca(); i++) {
                    bigList[i] = "[" + (i + 1) + "] " + Controlador.donaFitxerAudio(i + 1).toString();
                }
                // Mostrar panel donde seleccionar cancion:
                Object resp = JOptionPane.showInputDialog(null, "Selecciona la canción que quieres añadir", "Canción", JOptionPane.QUESTION_MESSAGE,
                        null, bigList, "Titan");
                String respuesta = resp.toString();
                // Regex para obtener indice cancion
                Pattern pattern = Pattern.compile("\\[(.*)\\]");
                Matcher coincidencias = pattern.matcher(respuesta);
                coincidencias.find();
                String indiceCancion = coincidencias.group(1);
                // Añadir cancion a lista
                FitxerAudio cancion = Controlador.donaFitxerAudio(Integer.parseInt(indiceCancion));
                Controlador.afegirFitxer(cancion, llista);
                // Recargar vista
                this.reloadCancionesListas();
            }
            
        }
        
    }//GEN-LAST:event_btnAddCancionActionPerformed

    /**
     * Boto per eliminar canco de llista
     * @param evt 
     */
    private void btnDelCancionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDelCancionActionPerformed
        // Obtener indice de lista seleccionada
        int indice = listasCombo.getSelectedIndex() + 1;
        if (indice <= 0) {
            // Si no hay bigList
            JOptionPane.showMessageDialog(null, "Primero debes crear una lista!");
        } else {
            // Cargar llista 
            LlistaReproduccio llista = Controlador.donaLlista(indice);
            // Obtener indice de cancion de lista seleccionada
            int indiceCancionLista = listasLista.getSelectedIndex()+1;
            Controlador.eliminarFitxer(indiceCancionLista, llista);
            // Recargar vista
            this.reload();
        }
    }//GEN-LAST:event_btnDelCancionActionPerformed

    /**
     * Accio al canviar el combo de llistes
     * @param evt 
     */
    private void listasComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_listasComboActionPerformed
        // Recargar canciones lista
        reloadCancionesListas();
    }//GEN-LAST:event_listasComboActionPerformed

    /**
     * Boto per reproduir una canco de la llista
     * @param evt 
     */
    private void btnPlayCancionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnPlayCancionActionPerformed
        // Obtener indice de lista seleccionada
        int indice = listasCombo.getSelectedIndex() + 1;
        if (indice <= 0) {
            // Si no hay bigList
            JOptionPane.showMessageDialog(null, "Primero debes crear una lista!");
        } else {
            // Cargar llista
            LlistaReproduccio llista = Controlador.donaLlista(indice);
            if(listasLista.getModel().getSize()>0){
                // Obtener indice de cancion de lista seleccionada
                int indiceCancionLista = listasLista.getSelectedIndex() + 1;
                System.out.println("ola");
                FitxerAudio f = Controlador.donaFitxerAudio(indiceCancionLista, llista);
                try {
                    // Reproducir fichero
                    Controlador.playFitxer(f);
                } catch (FitxerAudioErrorException ex) {
                    JOptionPane.showMessageDialog(null, "Error al reproducir archivo.");
                }
            } else {
                JOptionPane.showMessageDialog(null, "Primero debes añadir alguna canción!");
            }
            
        }
    }//GEN-LAST:event_btnPlayCancionActionPerformed

    /**
     * Boto Play
     * @param evt 
     */
    private void btnPlayMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnPlayMouseClicked
        // TODO add your handling code here:
        Controlador.play();
    }//GEN-LAST:event_btnPlayMouseClicked

    /**
     * Boto Pause
     * @param evt 
     */
    private void btnPauseMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnPauseMouseClicked
        // TODO add your handling code here:
        Controlador.pause();
    }//GEN-LAST:event_btnPauseMouseClicked

    /**
     * Boto Stop
     * @param evt 
     */
    private void btnStopMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnStopMouseClicked
        // TODO add your handling code here:
        Controlador.stop();
    }//GEN-LAST:event_btnStopMouseClicked

    /**
     * Boto Next
     * @param evt 
     */
    private void btnNextMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnNextMouseClicked
        try {
            // TODO add your handling code here:
            Controlador.next();
        } catch (FitxerAudioErrorException ex) {
            JOptionPane.showMessageDialog(null, "Error al reproducir archivo.");
        }
    }//GEN-LAST:event_btnNextMouseClicked

    /**
     * Boto Ciclic
     * @param evt 
     */
    private void btnRepetirMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnRepetirMouseClicked
        // TODO add your handling code here:
        Controlador.setCiclic();
    }//GEN-LAST:event_btnRepetirMouseClicked

    /**
     * Boto Aleatori
     * @param evt 
     */
    private void btnAleatoriMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_btnAleatoriMouseClicked
        // TODO add your handling code here:
        Controlador.setRandom();
    }//GEN-LAST:event_btnAleatoriMouseClicked

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(ReproductorUB4.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(ReproductorUB4.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(ReproductorUB4.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(ReproductorUB4.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ReproductorUB4().setVisible(true);
            }
        });
    }

    /**
     * Se encarga de recargar todos los componentes de la vista de modo que
     * se correspondan al modelo de datos
     */
    public void reload(){
        // Recargando vista
        System.out.println("Recargando vista...");
        
        //**************************************
        // Lista de Biblioteca
        //**************************************
        reloadBiblioteca();
        
        //**************************************
        // Listas de reproduccion
        //**************************************
        reloadListas();
        
        //**************************************
        // Lista de bigList de repr. seleccionada
        //**************************************
        reloadCancionesListas();
        
        
    }

    /**
     * Recarrega controls de biblioteca
     */
    public void reloadBiblioteca(){
        // Crear modelo
        DefaultListModel bibliotecaModel = new DefaultListModel();
        // Obtener biblioteca del controlador:
        LlistaFitxers biblioteca = Controlador.getBiblioteca();
        // Recorrer y añadir a modelo
        for (FitxerAudio f : biblioteca.taula) {
            bibliotecaModel.addElement(f);
        }
        // Set modelo
        bibliotecaLista.setModel(bibliotecaModel);
    }
    
    /**
     * Recarrega controles de llistes
     */
    public void reloadListas(){
        // Crear modelo
        DefaultComboBoxModel listasModel = new DefaultComboBoxModel();
        // Obtener listas repr.
        ArrayList<LlistaReproduccio> llistes_reproduccio = Controlador.donaLlistes();
        // Recorrer y añadir a modelo:
        for (LlistaReproduccio l : llistes_reproduccio) {
            listasModel.addElement(l.getNom());
        }
        // Set modelo:
        listasCombo.setModel(listasModel);
        // Cambiar siempre a ultima lista añadida
        listasCombo.setSelectedIndex(listasCombo.getItemCount() - 1);
    }
    
    /**
     * Recarrega controls de cancons de llista sel.
     */
    public void reloadCancionesListas(){
        // Crear modelo
        DefaultListModel listModel = new DefaultListModel();
        // Obtener lista repr. seleccionada:
        int indiceListaSel = listasCombo.getSelectedIndex() + 1;
        if (indiceListaSel > 0) {
            // Obtener canciones lista
            LlistaReproduccio lista = Controlador.donaLlista(indiceListaSel);
            LlistaFitxers lf = lista.donaLlistaFitxers();
            ArrayList<FitxerAudio> donaTaula = lf.donaTaula();
            // Recorrer y añadir a modelo
            for (FitxerAudio f : donaTaula) {
                listModel.addElement(f);
            }
            // Set modelo
            listasLista.setModel(listModel);
        }
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JList bibliotecaLista;
    private javax.swing.JScrollPane bibliotecaScrollPane;
    private javax.swing.JButton btnAddBiblioteca;
    private javax.swing.JButton btnAddCancion;
    private javax.swing.JButton btnAddLista;
    private javax.swing.JMenu btnAleatori;
    private javax.swing.JButton btnDelBiblioteca;
    private javax.swing.JButton btnDelCancion;
    private javax.swing.JButton btnDelLista;
    private javax.swing.JMenu btnNext;
    private javax.swing.JButton btnPLayBiblioteca;
    private javax.swing.JMenu btnPause;
    private javax.swing.JMenu btnPlay;
    private javax.swing.JButton btnPlayCancion;
    private javax.swing.JButton btnPlayLista;
    private javax.swing.JMenu btnRepetir;
    private javax.swing.JMenu btnStop;
    private javax.swing.JComboBox listasCombo;
    private javax.swing.JList listasLista;
    private javax.swing.JScrollPane listasScrollPane;
    private javax.swing.JMenuBar menuPrincipal;
    private javax.swing.JPanel panelBiblioteca;
    private javax.swing.JPanel panelListas;
    private javax.swing.JPanel tabBiblioteca;
    private javax.swing.JPanel tabListas;
    private javax.swing.JTabbedPane tabs;
    private javax.swing.JToolBar toolbarBiblioteca;
    private javax.swing.JToolBar toolbarListas;
    private javax.swing.JToolBar toolbarListas2;
    // End of variables declaration//GEN-END:variables
}
